
package frsf.cidisi.exercise.tp2.situationCalculus;

import java.util.Vector;

import frsf.cidisi.exercise.tp2.situationCalculus.EstadoActualArqueologo;
import frsf.cidisi.exercise.tp2.situationCalculus.actions.AvanzarAAragaey;
import frsf.cidisi.exercise.tp2.situationCalculus.actions.AvanzarAAse;
import frsf.cidisi.exercise.tp2.situationCalculus.actions.AvanzarABresol;
import frsf.cidisi.exercise.tp2.situationCalculus.actions.AvanzarABulovoe;
import frsf.cidisi.exercise.tp2.situationCalculus.actions.AvanzarACabe;
import frsf.cidisi.exercise.tp2.situationCalculus.actions.AvanzarACenede;
import frsf.cidisi.exercise.tp2.situationCalculus.actions.AvanzarAErgintone;
import frsf.cidisi.exercise.tp2.situationCalculus.actions.AvanzarAIcaedur;
import frsf.cidisi.exercise.tp2.situationCalculus.actions.AvanzarAMixocu;
import frsf.cidisi.exercise.tp2.situationCalculus.actions.AvanzarAPeregay;
import frsf.cidisi.exercise.tp2.situationCalculus.actions.AvanzarAVinizaile;
import frsf.cidisi.exercise.tp2.situationCalculus.actions.TomarTesoro;
import frsf.cidisi.exercise.tp2.interfaz.ControlSimulacion;
import frsf.cidisi.exercise.tp2.utiles.DatosAmbiente;
import frsf.cidisi.exercise.tp2.utiles.MetodosUtiles;
import frsf.cidisi.exercise.tp2.utiles.Parametros;
import frsf.cidisi.faia.agent.Action;
import frsf.cidisi.faia.agent.NoAction;
import frsf.cidisi.faia.agent.Perception;
import frsf.cidisi.faia.agent.search.SearchAction;
import frsf.cidisi.faia.agent.situationcalculus.SituationCalculusBasedAgent;
import frsf.cidisi.faia.exceptions.PrologConnectorException;
import frsf.cidisi.faia.simulator.Log;
import frsf.cidisi.faia.solver.situationcalculus.SituationCalculus;

public class Arqueologo extends SituationCalculusBasedAgent {

	private Parametros parametros;
	private MetodosUtiles metodosUtiles;
	private DatosAmbiente datosAmbiente;
	private Log log;
	private ControlSimulacion controlSimulacion;
    private Action lastAction = NoAction.getInstance();

    public Arqueologo() throws PrologConnectorException {
    	
        this.setAgentState(new EstadoActualArqueologo());
               
    }

    @Override
    public void tell(Action action) {
        EstadoActualArqueologo kb = this.getAgentState();
        kb.tell(action);
    }

    @Override
    public void see(Perception p) {
        this.getAgentState().updateState(p);
    }

    @Override
    public Action selectAction() {
        this.setSolver(new SituationCalculus());

        Action selectedAction = null;
        try {
            selectedAction = this.getSolver().solve(new Object[]{this.getAgentState()});
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
        this.lastAction = selectedAction;
        
        controlSimulacion.actualizarEstadoEnInterfaz();
//        controlSimulacion.actualizarConsolaEnInterfaz();
        
        return selectedAction;
    }

    @Override
    public EstadoActualArqueologo getAgentState() {
        EstadoActualArqueologo agentState = (EstadoActualArqueologo) super.getAgentState();

        return agentState;
    }

    public Action getLastAction() {
        return this.lastAction;
    }

	public void setParametros(Parametros parametros) {
		this.parametros = parametros;
	}

	public Parametros getParametros() {
		return parametros;
	}

	public void setMetodosUtiles(MetodosUtiles metodosUtiles) {
		this.metodosUtiles = metodosUtiles;
	}

	public MetodosUtiles getMetodosUtiles() {
		return metodosUtiles;
	}

	public void setDatosAmbiente(DatosAmbiente datosAmbiente) {
		this.datosAmbiente = datosAmbiente;
	}

	public DatosAmbiente getDatosAmbiente() {
		return datosAmbiente;
	}

	public void setLog(Log log) {
		this.log = log;
	}

	public Log getLog() {
		return log;
	}

	public void setControlSimulacion(ControlSimulacion controlSimulacion) {
		this.controlSimulacion = controlSimulacion;
	}

	public ControlSimulacion getControlSimulacion() {
		return controlSimulacion;
	}

	public void actualizarFuncionObjetivo() {

		this.getAgentState().updateObjetivo();
	}

	public void actualizarDatosAmbiente(int escenario) {
		 
//		((EstadoActualArqueologo)this.getAgentState()).setMapa(this.getDatosAmbiente().getEscenarios().get(escenario-1).getMapa());
//    	((EstadoActualArqueologo)this.getAgentState()).setPosicionEnMapa(this.getDatosAmbiente().getEscenarios().get(escenario-1).getPosicionEnMapa());
    	
		
	}

	
	
}
